package com.whzykj.resource;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.whzykj.common.CommonUtils;
import com.whzykj.common.DateUtil;
import com.whzykj.common.DbUtil;
import com.whzykj.common.JsonUtil;
import com.whzykj.common.ReturnEnum;
import com.whzykj.model.OrderDetails;
import com.whzykj.model.OrderInfo;
import com.whzykj.model.Price;
import com.whzykj.model.Store;
import com.whzykj.model.Userinfo;

import net.sf.json.JSONObject;

public class OrderManager {
	private static OrderManager instance=null;
	private int sum=0;
	private OrderManager(){
		
	}
	/**
	 * 单例模式，获取OrderManager对象
	 * @return
	 */
	public static OrderManager getInstance(){
		if(instance==null){
			instance=new OrderManager();
		}
		return instance;
	}
	
	/**
	 * 生成订单，使用同步方法
	 * 思路：1、先判断订单里面的数据，库存表中是否满足生成订单的条件，如果满足，将所有的SQL语句使用一个batch来执行；否则，返回false.
	 * @param messageObj
	 * @param result
	 * @return
	 */
	public synchronized String addorderinfo(JSONObject messageObj, JSONObject result) {
		String str=null;
		// 1：查询该商品在库存表中的库存信息和限购信息，如果库存不足或购买数量大于限购数量，则返回false,停止操作
		// 商品明细
		Object goodsobj = messageObj.get("order_pay_detail");
		List<Map<String, Object>> orderPayDetails = JsonUtil.getList4Json(goodsobj.toString(), Map.class);
		for (Map<String, Object> orderPayDetail : orderPayDetails) {
			String goodsid = orderPayDetail.get("goods_id").toString();		// 获取商品编号
			String num = orderPayDetail.get("num").toString();				// 获取购买商品的数量
			// 查询该商品在库存表中的库存信息
			String sql="select * from store where TO_DAYS(SET_DATE)=TO_DAYS(NOW()) AND GOODS_ID=?";
			Store store=Store.me.findFirst(sql, goodsid);					// 查询该商品当日库存的信息
			if(store==null){
				return null;
			}
			int store_num = store.getInt("store_num");						// 获取预计库存数量
			int sale_num = store.getInt("sale_num");						// 获取销售数量
			int limit_num = store.getInt("limit_num");						// 获取该商品限购数量
			int snum=Integer.parseInt(num);									// 库存=预设库存数 - 销售总量
			int stock=store_num-sale_num;
			if(snum>limit_num || stock<=0 || snum>stock){					// 订购数量超过限购数量，返回失败；商品库存小于等于0，返回失败；商品订购数量>库存表中商品数量,返回失败。
				JsonUtil.put(result, ReturnEnum.ORDER_ADD_FAIL);			
				return null;												// 任意一条不满足时。   
			}											
			
		}
		
		// 2：保存订单信息、保存订单明细信息、对库存表中的信息进行修改
		String orderid = CommonUtils.generateSeq();							// 获取自动生成的订单编号
		String userid = messageObj.getString("user_id");					// 获取操作的用户信息
		Userinfo userinfo = Userinfo.dao.findById(userid);
		int custid = userinfo.getInt("cust_id");							// 获取登录用户所对应的客户编号
		
		// 设置提货日期
		BigDecimal ordermoney = new BigDecimal("0.00");						// 订单金额
		BigDecimal minusmoney = new BigDecimal("0.00");						// 优惠金额
		BigDecimal realmoney = new BigDecimal("0.00");						// 实付金额
		List<String> sqlList=new ArrayList<String>();						// 保存SQL语句
		StringBuffer sb=null;
		for (Map<String, Object> orderPayDetail : orderPayDetails) {
			OrderDetails details = new OrderDetails();
			String goodsid = orderPayDetail.get("goods_id").toString();		// 获取商品编号
			String num = orderPayDetail.get("num").toString();				// 获取购买商品的数量			
			// 查询价格
			String sql=" SELECT * from price where TO_DAYS(SET_DATE)=TO_DAYS(NOW()) AND GOODS_ID=? AND STATION_ID IN(select STATION_ID from customer where CUST_ID=?)"; 
			Price price=Price.me.findFirst(sql,goodsid,custid);
			if(price==null){
				return null;
			}
//			Record pricerd = getPriceById(goodsid, userid);
			BigDecimal sale_price = price.getBigDecimal("sale_price");		// 获得价格表中该商品的销售价格
			BigDecimal minus_price = price.getBigDecimal("minus_price");	// 获得价格表中该商品的优惠价格
			int count = minus_price.compareTo(BigDecimal.ZERO);				// 如果优惠价格为0
			BigDecimal numbe = new BigDecimal(num);							// 数量
			if(count==0){													// 优惠金额为0：
				BigDecimal paraDe1 = sale_price.multiply(numbe);			// 获取d
				ordermoney = ordermoney.add(paraDe1);// 原价
				realmoney = realmoney.add(paraDe1);// 实价
			}else{
				BigDecimal paraDe1 = sale_price.multiply(numbe);				// 原总价
				BigDecimal paraDe2 = minus_price.multiply(numbe);				// 优惠金额
				BigDecimal realM = paraDe1.subtract(paraDe2);					// 实际支付价格

				ordermoney = ordermoney.add(paraDe1);							// 计算订单总的原价
				minusmoney=minusmoney.add(paraDe2);								// 计算优惠总价
				realmoney = realmoney.add(realM);								// 计算订单总的支付价
			}
			sb=new StringBuffer(" INSERT INTO orderdetails(ORDER_ID,GOODS_ID,ORIGINAL_PRICE,SALE_PRICE,SALE_NUM,RETURN_NUM)VALUES('");
			sb.append(orderid+"',"+goodsid+","+sale_price+","+(sale_price.subtract(minus_price))+","+num+",0)");
			sqlList.add(sb.toString());			// 	将信息保存到订单明细表中
			sb=null;
			sb=new StringBuffer(" UPDATE store SET SALE_NUM=SALE_NUM+"+num);
			sb.append(" where TO_DAYS(SET_DATE)=TO_DAYS(NOW()) AND GOODS_ID="+goodsid);
			sqlList.add(sb.toString());			// 修改库存表中对应的信息
			sb=null;
		}
		sb=new StringBuffer(" insert into orderinfo values('"+orderid+"',");
		sb.append(custid+","+userid);
		sb.append(",'"+DateUtil.getNow()+"','"+CommonUtils		
				.getSpecifiedDayAfter(CommonUtils.getCurrentDate())+"',");
		sb.append(ordermoney+","+minusmoney+","+realmoney+",");
		sb.append("0,10,'no_pay','','')");
		sqlList.add(0, sb.toString());  		// 将信息保存到订单信息表
		sb=null;
		try {
//			int[] cnts=Db.batch(sqlList, 100);
			boolean res=DbUtil.batch(sqlList);
			str=orderid;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			str=null;
		}
		return str;
	}
	
	public void print(){
		System.out.println(sum);
	}
}
